package com.yangjun.utils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipUtil {
	 public static File zip(String filePath,String zipName) {
	        File target = null;
	        File source = new File(filePath);
	        if (source.exists()) {
	            // 压缩文件名=源文件名.zip
	            target = new File(source.getParent(), zipName);
	            if (target.exists()) {
	                target.delete(); // 删除旧的文件
	            }
	            FileOutputStream fos = null;
	            ZipOutputStream zos = null;
	            try {
	                fos = new FileOutputStream(target);
	                zos = new ZipOutputStream(new BufferedOutputStream(fos));
	                // 添加对应的文件Entry
	                addEntry("/", source, zos);
	            } catch (IOException e) {
	                throw new RuntimeException(e);
	            } finally {
	            	if(zos!=null){
	            		try {
							zos.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
	                }
	                if(fos!=null){
	                	try {
							fos.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
	                }
	            }
	        }
	        return target;
	    }
	 
	 /**
	     * 扫描添加文件Entry
	     * 
	     * @param base  基路径
	     * @param source 源文件
	     * @param zos Zip文件输出流
	     * @throws IOException
	     */
	    private static void addEntry(String base, File source, ZipOutputStream zos)
	            throws IOException {
	        // 按目录分级，形如：/aaa/bbb.txt
	        String entry = base + source.getName();
	        if (source.isDirectory()) {
	            for (File file : source.listFiles()) {
	                // 递归列出目录下的所有文件，添加文件Entry
	                addEntry(entry + "/", file, zos);
	            }
	        } else {
	            FileInputStream fis = null;
	            BufferedInputStream bis = null;
	            try {
	                byte[] buffer = new byte[1024 * 10];
	                fis = new FileInputStream(source);
	                bis = new BufferedInputStream(fis, buffer.length);
	                int read = 0;
	                zos.putNextEntry(new ZipEntry(entry));
	                while ((read = bis.read(buffer, 0, buffer.length)) != -1) {
	                    zos.write(buffer, 0, read);
	                }
	                zos.closeEntry();
	            } finally {
	                if(bis!=null){
	                	bis.close();
	                }
	                if(fis!=null){
	                	fis.close();
	                }
	            }
	        }
	    }
}
